/**
 * TODO: Vložit licenci.
 */

package cz.enif.commander.values;

import java.util.List;

/**
 * Hodnota určitého typu.
 * 
 * @author enif
 *
 */
public interface IValue 
{
	/**
     * Typy hodnot uložených v objektu Value.
     */
    public enum ValueType
    {
    	BOOLEAN,    // true false
        INT,        // 1 -23 +56
        DOUBLE,     // 1.0 3.14 -5e10
        STRING,		// "A string"
        TUPLE		// 1/5/-6  1/"string"/4.2
    }
    
    /**
     * Vrací typ hodnoty uložené v tomto objektu.
     * 
     * @return Typ hodnoty uložené v tomto objektu.
     */
    public ValueType getType();
    
    /**
     * Zjistí, zda je hodnota uložená v tomto objektu typu BOOLEAN.
     *
     * @return True, pokud hodnota uložená v tomto objektu je typu BOOLEAN.
     */
    public boolean isBoolean();
    
    /**
     * Zjistí, zda je hodnota uložená v tomto objektu typu INT.
     *
     * @return True, pokud hodnota uložená v tomto objektu je typu INT.
     */
    public boolean isInt();

    /**
     * Zjistí, zda je hodnota uložená v tomto objektu typu DOUBLE.
     *
     * @return True, pokud hodnota uložená v tomto objektu je typu DOUBLE.
     */
    public boolean isDouble();

    /**
     * Zjistí, zda je hodnota uložená v tomto objektu typu STRING.
     *
     * @return True, pokud hodnota uložená v tomto objektu je typu STRING.
     */
    public boolean isString();

    /**
     * Zjistí, zda je hodnota uložená v tomto objektu typu TUPLE.
     *
     * @return True, pokud hodnota uložená v tomto objektu je typu TUPLE.
     */
    public boolean isTuple();
    
    /**
     * Vrací hodnotu uloženou v tomto objektu převedenou na BOOLEAN.
     *
     *  @return Hodnotu uloženou v tomto objektu převedenou na BOOLEAN.
     */
    public boolean getBooleanValue();
    
    /**
     * Vrací hodnotu uloženou v tomto objektu převedenou na celé číslo.
     *
     *  @return Hodnotu uloženou v tomto objektu převedenou na celé číslo.
     */
    public int getIntValue();

    /**
     * Vrací hodnotu uloženou v tomto objektu převedenou na reálné číslo.
     *
     *  @return Hodnotu uloženou v tomto objektu převedenou na reálné číslo.
     */
    public double getDoubleValue();

    /**
     * Vrací hodnotu uloženou v tomto objektu převedenou na řetězec.
     *
     *  @return Hodnotu uloženou v tomto objektu převedenou na řetězec.
     */
    public String getStringValue();
    
    /**
     * Vrací hodnotu uloženou v tomto objektu jako TUPLE.
     *
     *  @return Hodnotu uloženou v tomto objektu jako TUPLE.
     */
    public List<IValue> getTupleValue();
    
    /**
     * Vrací počet hodnot uložených v tuple, případně kolik pozic by tato hodnota
     * v tuple zabrala. Může vrátit 0, pokud hodnota je typu tuple, ale neobsahuje
     * žádné položky.
     *
     *  @return Počet hodnot uložených v tuple.
     */
    public int getSize();
}
